// pages/gaokao/zikao_exam_extra/zikao_exam_extra.js
const http = require('../../../utils/http.js');           // HTTP 请求工具
const tools = require('../../../utils/tools.js');         // 通用工具方法

Page({
  data: {
    // 补充报名信息，只保存必要字段
    zikao_exam_extra: {
      office_phone: '',            // 办公电话
      postal_code: '',             // 邮政编码
      address: '',                 // 详细住址
      mobile_phone2: '',           // 备用联系电话
      work_unit: '',               // 当前就职单位
      email: '',                   // 电子邮箱
      work_unit_address: '',  // 工作单位所在地编码
      current_residence: '',        // 现实际居住地
      police_school_student_id: '',// 警院在校生学号
      police_officer_number: '',    // 在职在编民警警号
      // 固定字段，不展示：
      registration_time: '',       // 报名日期（自动设置）
      police_review_flag: 0,
      attend_exam_punctually: 1
    },
    // 下拉选项与下标
    workUnitAddressOptions: [], workUnitAddressIndex: null,
    // 录音状态
    recording: false,
    recordFilePath: '',
    buttonText: '开始录音'
  },

  /**
   * 生命周期函数：页面加载
   * 加载工作单位所在地选项，并填充本地保存数据（含下标）
   */
  onLoad() {
    // 拉取县市列表，用于工作单位所在地
    tools.fetchOptions('/gaokao/GkCounty/all', 'workUnitAddressOptions', this)
      .then(() => {
        // 尝试加载本地保存
        const stored = wx.getStorageSync('zikao_exam_extra');
        if (stored) {
          this.setData({ zikao_exam_extra: stored });
          this.updateIndexByStored(stored);
        }
      })
      .catch(err => {
        console.error('工作单位所在地选项加载失败', err);
        wx.showToast({ title: '基础数据加载失败', icon: 'none' });
      });
  },

  /**
   * 根据本地存储的编码，更新下拉框选中下标
   */
  updateIndexByStored(data) {
    this.setData({ workUnitAddressIndex: tools.findIndexByCode(this.data.workUnitAddressOptions, data.work_unit_address) });
  },

  /**
   * 通用文本输入处理
   */
  handleInput(e) {
    const f = e.currentTarget.dataset.field;
    this.setData({ [`zikao_exam_extra.${f}`]: e.detail.value });
  },

  /**
   * 下拉选择处理：仅支持工作单位所在地
   */
  handlePickerChange(e) {
    const idx = e.detail.value;
    const code = this.data.workUnitAddressOptions[idx].code;
    this.setData({
      [`zikao_exam_extra.work_unit_address`]: code,
      workUnitAddressIndex: idx
    });
  },

  /**
   * 提交并保存：自动设置报名日期及固定字段
   */
  handleSubmit() {
    const d = this.data.zikao_exam_extra;
    // 对页面数据和本地数据进行比较，检查信息是否有修改
    // 待检查字段对照表
    const fieldsToCheck = [
      'office_phone',
      'postal_code',
      'address',
      'mobile_phone2',
      'work_unit',
      'email',
      'work_unit_address',
      'current_residence',
      'police_school_student_id',
      'police_officer_number'
    ];
    const storedInfo = wx.getStorageSync('zikao_exam_extra');
    // 检查
    if(tools.checkDataChanged(d , storedInfo, fieldsToCheck)){
      // 假设 d = this.data.zikao_exam_extra
      const idNumber = wx.getStorageSync('base_candidate_info').id_number;
      // 自动设置报名日期为当天
      d.registration_time = tools.formatDate(new Date());
      // 设置固定值
      d.police_review_flag = 0;
      d.attend_exam_punctually = 1;
      const postData = {
        idNumber: idNumber,
        officePhone: d.office_phone,
        postalCode: d.postal_code,
        address: d.address,
        mobilePhone2: d.mobile_phone2,
        workUnit: d.work_unit,
        email: d.email,
        workUnitAddress: d.work_unit_address,
        currentResidence: d.current_residence,
        policeSchoolStudentId: d.police_school_student_id,
        policeOfficerNumber: d.police_officer_number,
        registrationTime: tools.formatDate(new Date()),
        policeReviewFlag: 0,
        attendExamPunctually: 1
      };

      console.log("postData is ",postData)
      http.post('/zikao/registration/upsert', postData).then(res =>{
        if(res.data.code == 200){
          // 更新本地数据
          wx.setStorageSync('zikao_exam_extra', d);
          wx.showToast({title: '保存成功'});
          // 跳转页面
          wx.reLaunch({url: '/pages/zikao/zk_exam_registrationInfo/zk_exam_registrationInfo'})
        }
      }).catch(err =>{
        wx.showToast({title: '保存失败'})
        console.log("学籍信息更新失败",err)
      })
    }else{
      // 直接跳转页面
      wx.reLaunch({  url: '/pages/zikao/zk_exam_registrationInfo/zk_exam_registrationInfo' })
    }
  },

  // 语音功能区
  /**
   * 切换录音状态：开始/停止录音
   */
  toggleRecording() {
    if (this.data.recording) {
      // 停止录音
      this.setData({ recording: false, buttonText: '开始录音' });
      const manager = wx.getRecorderManager();
      manager.stop();
      manager.onStop(res => {
        wx.setStorageSync('recordPath', res.tempFilePath)
        this.setData({ recordFilePath: res.tempFilePath , buttonText : '开始录音'});
      });
    } else {
      // 开始录音，需权限
      tools.checkRecordPermission()
        .then(() => {
          this.setData({ recording: true, buttonText: '停止录音' });
          const manager = wx.getRecorderManager();
          manager.start({ format: 'wav', duration: 60000, sampleRate: 44100, numberOfChannels: 1, encodeBitRate: 96000 });
        })
        .catch(err => wx.showToast({ title: err.message, icon: 'none' }));
    }
  },

  /**
   * 上传录音并发起语音识别
   */
  uploadAndRecognizeRecording() {
    if (!this.data.recordFilePath) {
     wx.showToast({ title: '请先录音', icon: 'none' });
     return;
    }
    const filePath = this.data.recordFilePath;
    // 调用后端识别接口
    http.asr(filePath).then(res =>{
      console.log("语音识别成功，文本如下：")
      console.log(res);
      // 根据返回的文本信息，提取其中的信息
      this.setData({ editableContent: res });
      // 调用后端的提取接口
      const postData = { "text": res };
      http.zkExtract(postData).then(res =>{
        // 处理提取后的结果
        console.log("提取后的结果，如下：")
        console.log(res)
        this.mapVoiceResult(res.data);
      }).catch(err => {
        // 提取失败
        console.log('无法解析识别结果：', err);
        console.log('接收到的原始返回数据：', err.data);
      });
    }).catch(err =>{
      // 语音识别失败
      console.log('语音识别失败：', err);
      wx.showToast({ title: '录音识别失败', icon: 'none', duration: 2000 });
    })
  },

  /**
   * 将语音识别返回的字段映射到对应编码/文本
   * @param {Object} fields 返回的字段键值对
   */
  mapVoiceResult(dataFields) {
    // 直接赋值字段
    const fields = ['office_phone', 'postal_code', 'address', 'mobile_phone2', 'work_unit', 'email',  'current_residence', 'police_school_student_id', 'police_officer_number']
    // 对字段进行直接赋值
    Object.entries(fields).forEach(key =>{
      if(!dataFields[key].includes("未知")){
        this.setData({
          [`zikao_exam_extra.${key}`]:dataFields[key]
        })
      }
    })
    // 对work_unit_address进行特殊处理
    if(!dataFields["work_unit_address"].includes("未知")){
      this.setData({
        [zikao_exam_extra.work_unit_address]: tools.findCodeByName(this.data.workUnitAddressOptions, dataFields["work_unit_address"])
      })
      // 更新下标
      this.updateIndexByStored(this.data.zikao_exam_extra)
    }
  }
});